package com.example.ad.sdk.domain.view

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.viewbinding.ViewBinding
import com.example.ad.sdk.domain.extensions.inflateBindingWithGeneric

/**
 * BaseBingFragment 是一个抽象基类，基于 MVVM/MVI 架构设计，结合 ViewBinding 提供了更简洁的视图绑定方式。
 * 它继承自 [BaseFragment]，并扩展了 ViewBinding 的功能，适用于所有需要使用 MVVM/MVI 架构和 ViewBinding 的 Fragment 场景。
 *
 * ### 主要功能
 * 1. **ViewBinding 支持**：通过 [inflateBindingWithGeneric] 方法动态创建 ViewBinding 实例，避免手动 findViewById 操作。
 * 2. **布局加载**：重写了 [layoutId] 和 [onCreateView] 方法，使用 ViewBinding 替代传统的布局资源 ID 加载方式。
 * 3. **简化视图操作**：通过 [bing] 属性提供对 ViewBinding 的直接访问，方便在子类中操作视图组件。
 *
 * ### 关键属性
 * - [_binding]: 私有属性，存储当前 Fragment 的 ViewBinding 实例。
 * - [bing]: 公开只读属性，用于在子类中访问 ViewBinding 实例。
 *
 * ### 生命周期方法
 * - [layoutId]: 返回值固定为 0，表示不使用传统的布局资源 ID 加载方式。
 * - [onCreateView]: 创建并初始化 ViewBinding 实例，并返回其根视图以设置内容视图。
 *
 * ### 使用场景
 * - 适用于所有需要继承 Fragment 并使用 MVVM/MVI 架构和 ViewBinding 的模块化开发场景。
 * - 提供了统一的 ViewBinding 初始化逻辑，减少重复代码。
 *
 */
abstract class BaseBingFragment<VB : ViewBinding> : BaseFragment() {
    override fun layoutId() = 0

    // ViewBinding实例，使用延迟初始化
    private var _binding: VB? = null

    /**
     * 只读属性，用于获取ViewBinding实例。
     * 在Fragment的生命周期内，确保binding不为null。
     * 如果binding为null，抛出异常提示Fragment的binding已被销毁。
     */
    protected val vb: VB
        get() = requireNotNull(_binding) { "The Fragment of binding has been destroyed." }
    /**
     * 创建Fragment的视图。
     * 使用泛型安全的方式创建ViewBinding实例，并初始化视图。
     */
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?,
    ): View? {
        _binding = inflateBindingWithGeneric(inflater, container, false)
        return _binding?.run {
            root
        }
    }
    /**
     * 当Fragment的视图被销毁时调用。
     * 清空ViewBinding引用，避免内存泄漏。
     */
    override fun onDestroyView() {
        super.onDestroyView()
        // 清空ViewBinding引用，避免内存泄漏
        _binding = null
    }
}